# 多阶段构建 Docker 镜像用于 Next.js 应用部署

# 基础镜像阶段
FROM node:18-alpine AS base

# 安装必要的系统依赖
RUN apk add --no-cache libc6-compat

# 设置工作目录
WORKDIR /app

# 安装 pnpm
RUN npm install -g pnpm

# 依赖安装阶段
FROM base AS deps

# 复制依赖配置文件
COPY package.json pnpm-lock.yaml* ./

# 安装生产和开发依赖
RUN pnpm install --frozen-lockfile

# 构建阶段
FROM base AS builder

# 复制依赖
COPY --from=deps /app/node_modules ./node_modules

# 复制源代码
COPY . .

# 设置构建时环境变量（可选）
ARG OPENAI_API_KEY
ARG OPENAI_BASE_URL
ARG OPENAI_MODEL
ENV OPENAI_API_KEY=$OPENAI_API_KEY
ENV OPENAI_BASE_URL=$OPENAI_BASE_URL
ENV OPENAI_MODEL=$OPENAI_MODEL

# 构建应用
RUN pnpm build

# 生产运行阶段
FROM base AS runner

# 设置生产环境
ENV NODE_ENV=production

# 创建系统用户和组
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

# 复制 public 目录
COPY --from=builder /app/public ./public

# 复制 standalone 输出文件
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

# 切换到非特权用户
USER nextjs

# 暴露端口
EXPOSE 3000

# 设置环境变量
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"

# 启动应用
CMD ["node", "server.js"]
